
#include "TimeUtil.h"
#include <TimeLib.h>

/*-------- NTP code ----------*/

const int NTP_PACKET_SIZE = 48;     // NTP时间在消息的前48字节中
byte packetBuffer[NTP_PACKET_SIZE]; // buffer to hold incoming & outgoing packets

boolean isNtpSuccess = false;

WiFiUDP Udp;

//number转字符串
String num2str(int digits) {
    String s = "";
    if (digits < 10)
        s = s + "0";
    s = s + digits;
    return s;
}

//星期
String week() {
    String wk[7] = {"日", "一", "二", "三", "四", "五", "六"};
    String s = "周" + wk[weekday() - 1];
    return s;
}

//月日
String monthDay() {
    String s = String(month());
    s = s + "/" + day();
    return s;
}

//时分
String hourMinute() {
    String s = num2str(hour());
    s = s + ":" + num2str(minute());
    return s;
}

//时分
String hourMinute(String time) {
    String s = num2str(hour(time.toInt()));
    s = s + ":" + num2str(minute(time.toInt()));
    return s;
}

// 向NTP服务器发送请求
void sendNTPpacket(IPAddress &address) {
    // set all bytes in the buffer to 0
    memset(packetBuffer, 0, NTP_PACKET_SIZE);
    // Initialize values needed to form NTP request
    // (see URL above for details on the packets)
    packetBuffer[0] = 0b11100011; // LI, Version, Mode
    packetBuffer[1] = 0;          // Stratum, or type of clock
    packetBuffer[2] = 6;          // Polling Interval
    packetBuffer[3] = 0xEC;       // Peer Clock Precision
    // 8 bytes of zero for Root Delay & Root Dispersion
    packetBuffer[12] = 49;
    packetBuffer[13] = 0x4E;
    packetBuffer[14] = 49;
    packetBuffer[15] = 52;
    // all NTP fields have been given values, now
    // you can send a packet requesting a timestamp:
    Udp.beginPacket(address, 123); // NTP requests are to port 123
    Udp.write(packetBuffer, NTP_PACKET_SIZE);
    Udp.endPacket();
}

time_t getNtpTime() {

    IPAddress ntpServerIP; // NTP server's ip address

    while (Udp.parsePacket() > 0); // discard any previously received packets
    // Serial.println("Transmit NTP Request");
    //  get a random server from the pool
    WiFi.hostByName(ntpServerName, ntpServerIP);
    Serial.print(ntpServerName);
    Serial.print(": ");
    Serial.println(ntpServerIP);
    sendNTPpacket(ntpServerIP);
    uint32_t beginWait = millis();
    while (millis() - beginWait < 1500) {
        int size = Udp.parsePacket();
        if (size >= NTP_PACKET_SIZE) {
            Serial.println("Receive NTP Response");
            Udp.read(packetBuffer, NTP_PACKET_SIZE); // read packet into the buffer
            unsigned long secsSince1900;
            // convert four bytes starting at location 40 to a long integer
            secsSince1900 = (unsigned long) packetBuffer[40] << 24;
            secsSince1900 |= (unsigned long) packetBuffer[41] << 16;
            secsSince1900 |= (unsigned long) packetBuffer[42] << 8;
            secsSince1900 |= (unsigned long) packetBuffer[43];
            //时间校准成功，设置同步间隔为5分钟
            isNtpSuccess = true;
            setSyncInterval(300);
            return secsSince1900 - 2208988800UL + timeZone * SECS_PER_HOUR;
        }
    }
    Serial.println("No NTP Response :-(");
    if (!isNtpSuccess) {
        //时间校准失败，设置同步间隔为10秒
        setSyncInterval(10);
    }
    return 0; // 无法获取时间时返回0
}